//
//  UICollectionView+ZKChain.h
//  ChainFun
//
//  Created by 洪绵卫 on 2022/1/11.
//

#import <UIKit/UIKit.h>

NS_ASSUME_NONNULL_BEGIN
/*
    所有函数均只有getter函数.
    zk_frame 对应的 frame属性 其余一样，去除zk_ 后边的为对应的属性名
 */
@interface UICollectionView (ZKChain)

/* 因为父类的Category中返回的是UIView类型，不便于链式继续调用，所以这里写同名的get方法，返回值不同 */

/// 初始化 没有设置Frame
+ (UICollectionView * _Nonnull (^)(void))zk_allocInit;

/// 带Frame的初始化
+ (UICollectionView * _Nonnull (^)(CGRect))zk_allocInitWithFrame;

/// 设置View的Frame
- (UICollectionView * _Nonnull (^)(CGRect))zk_frame;

/// 设置View的背景色
- (UICollectionView * _Nonnull (^)(UIColor * _Nonnull))zk_backgroundColor;

/// 将View添加到父视图上
- (UICollectionView * _Nonnull (^)(UIView * _Nonnull))zk_addToSuperView;

/// 设置View是否允许交互
- (UICollectionView * _Nonnull (^)(BOOL))zk_userInteractionEnabled;

/// 设置View的Tag
- (UICollectionView * _Nonnull (^)(NSInteger))zk_tag;

/// 设置View的Bounds
- (UICollectionView * _Nonnull (^)(CGRect))zk_bounds;

/// 设置View的中心点
- (UICollectionView * _Nonnull (^)(CGPoint))zk_center;

/// 设置View的透明度
- (UICollectionView * _Nonnull (^)(CGFloat))zk_alpha;

/// 设置View的隐藏状态
- (UICollectionView * _Nonnull (^)(BOOL))zk_hidden;

/// 设置View的TitColor
- (UICollectionView * _Nonnull (^)(UIColor * _Nonnull))zk_tintColor;



#pragma mark UIScrollView 的

/// 内容偏移量
- (UICollectionView * _Nonnull (^)(CGPoint))zk_contentOffset;

/// 内容大小
- (UICollectionView * _Nonnull (^)(CGSize))zk_contentSize;

/// 内容边距
- (UICollectionView * _Nonnull (^)(UIEdgeInsets))zk_contentInset;

/// 确定调整后的内容偏移量的行为。
- (UICollectionView * _Nonnull (^)(UIScrollViewContentInsetAdjustmentBehavior))zk_contentInsetAdjustmentBehavior API_AVAILABLE(ios(11.0));

/// 表示系统是否自动调整滚动指示器的插入。
- (UICollectionView * _Nonnull (^)(BOOL))zk_automaticallyAdjustsScrollIndicatorInsets API_AVAILABLE(ios(13.0));

/// 边框是否支持回弹效果
- (UICollectionView * _Nonnull (^)(BOOL))zk_bounces;

/// 垂直方向边框是否支持回弹效果
- (UICollectionView * _Nonnull (^)(BOOL))zk_alwaysBounceVertical;

/// 水平方向边框是否支持回弹效果
- (UICollectionView * _Nonnull (^)(BOOL))zk_alwaysBounceHorizontal;

/// 是否分页
- (UICollectionView * _Nonnull (^)(BOOL))zk_pagingEnabled;

/// 是否可以滚动
- (UICollectionView * _Nonnull (^)(BOOL))zk_scrollEnabled;

/// 是否显示垂直显示器
- (UICollectionView * _Nonnull (^)(BOOL))zk_showsVerticalScrollIndicator;

/// 是否显示水平显示器
- (UICollectionView * _Nonnull (^)(BOOL))zk_showsHorizontalScrollIndicator;

/// 指示器样式
- (UICollectionView * _Nonnull (^)(UIScrollViewIndicatorStyle))zk_indicatorStyle;

/// 垂直方向指示器的偏移量
- (UICollectionView * _Nonnull (^)(UIEdgeInsets))zk_verticalScrollIndicatorInsets API_AVAILABLE(ios(11.1), tvos(11.1));;

/// 水平方向指示器的偏移量
- (UICollectionView * _Nonnull (^)(UIEdgeInsets))zk_horizontalScrollIndicatorInsets API_AVAILABLE(ios(11.1), tvos(11.1));

/// 指示器的偏移量
- (UICollectionView * _Nonnull (^)(UIEdgeInsets))zk_scrollIndicatorInsets;

/// 最小缩放
- (UICollectionView * _Nonnull (^)(CGFloat))zk_minimumZoomScale;

/// 最大缩放
- (UICollectionView * _Nonnull (^)(CGFloat))zk_maximumZoomScale;

/// 缩放尺度
- (UICollectionView * _Nonnull (^)(CGFloat))zk_zoomScale;

/// 它决定当缩放超过最大或最小限制时滚动视图是否对内容缩放进行动画处理
- (UICollectionView * _Nonnull (^)(BOOL))zk_bouncesZoom;

/// 控制是否启用滚动到顶部的手势
- (UICollectionView * _Nonnull (^)(BOOL))zk_scrollsToTop;

/// 在滚动视图中开始拖动时取消键盘的方式
- (UICollectionView * _Nonnull (^)(UIScrollViewKeyboardDismissMode))zk_keyboardDismissMode;

/// 刷新控制
- (UICollectionView * _Nonnull (^)(UIRefreshControl * _Nullable))zk_refreshControl API_AVAILABLE(ios(10.0));



#pragma mark 对应着 UICollectionView 的一些属性

/// 设置数据源
- (UICollectionView * _Nonnull (^)(id <UICollectionViewDataSource> _Nullable))zk_dataSource;

/// 设置代理
- (UICollectionView * _Nonnull (^)(id <UICollectionViewDelegate> _Nullable))zk_delegate;

/// 设置Layout
- (UICollectionView * _Nonnull (^)(UICollectionViewLayout * _Nonnull))zk_collectionViewLayout;

- (UICollectionView * _Nonnull (^)(id<UICollectionViewDataSourcePrefetching> _Nullable))zk_prefetchDataSource API_AVAILABLE(ios(10.0));

/// 管理从集合视图拖动项的委托对象
- (UICollectionView * _Nonnull (^)(id <UICollectionViewDragDelegate> _Nullable))zk_dragDelegate API_AVAILABLE(ios(11.0));

/// 管理将项拖放到集合视图中的委托对象。
- (UICollectionView * _Nonnull (^)(id <UICollectionViewDropDelegate> _Nullable))zk_dropDelegate API_AVAILABLE(ios(11.0));

/// 要支持将内容从集合视图拖拽到应用程序或其他应用程序中的视图，请将此属性值设置为YES。若要禁用此行为，请将该值设置为NO。默认值为“YES”。
- (UICollectionView * _Nonnull (^)(BOOL))zk_dragInteractionEnabled API_AVAILABLE(ios(11.0)) API_UNAVAILABLE(tvos, watchos);

/// 这个属性的默认值是UICollectionViewReorderingCadenceImmediate。
/// 当您希望防止重新排序的项目对用户造成干扰时，可以指定较慢的节奏。例如，如果立即重新排序使得在正确的位置删除项目变得更加困难，则可能会降低它的速度。
- (UICollectionView * _Nonnull (^)(UICollectionViewReorderingCadence))zk_reorderingCadence API_AVAILABLE(ios(11.0)) API_UNAVAILABLE(tvos, watchos);

/// 背景视图
- (UICollectionView * _Nonnull (^)(UIView * _Nullable))zk_backgroundView;



#pragma mark 对应着 UICollectionView 的一些方法

/// 初始化函数  对应着 - (instancetype)initWithFrame:(CGRect)frame collectionViewLayout:(UICollectionViewLayout *)layout
- (UICollectionView * _Nonnull (^)(CGRect,UICollectionViewLayout * _Nonnull))zk_allocInitWithLayout;

@end

NS_ASSUME_NONNULL_END
